package com.zf.nio.pipe;

import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

/**
 * Java NIO 管道是 2 个线程之间的单向数据连接。Pipe 有一个 source 通道和一个 sink
 * 通道。数据会被写到 sink 通道，从 source 通道读取。
 *
 * @author Zhou Feng
 */
public class PipeDemo01 {
    @Test
    public void testPipe() throws IOException {
        // 1、获取通道
        Pipe pipe = Pipe.open();
        // 2、获取 sink 管道，用来传送数据
        Pipe.SinkChannel sinkChannel = pipe.sink();
        // 3、申请一定大小的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        byteBuffer.put("atguigu".getBytes());
        byteBuffer.flip();
        // 4、sink 发送数据
        sinkChannel.write(byteBuffer);
        // 5、创建接收 pipe 数据的 source 管道
        Pipe.SourceChannel sourceChannel = pipe.source();
        // 6、接收数据，并保存到缓冲区中
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(1024);
        int length = sourceChannel.read(byteBuffer2);
        System.out.println(new String(byteBuffer2.array(), 0, length));
        sourceChannel.close();
        sinkChannel.close();
    }
}
